var Game = {
    // 游戏主画面
    start: function() {
        // 加载启动图片
        var load = new Load();
        load.draw();

        // 判断游戏是否开启，如果开启，则不需要改变鼠标的样式（避免游戏过程中，鼠标移入，产生鼠标其他样式）
        var isOver = true;

        // 监听鼠标移动事件=>在开启画面上，如果鼠标移入到指定位置，改变鼠标的样式
        canvas.addEventListener('mousemove', function(e) {
            if (isOver) {
                // 获取点击的点是否是开始游戏的范围
                var res = Tool.isScope({ x: e.offsetX, y: e.offsetY }, { x: (canvas.width - 270) / 2, y: 350, width: 270, height: 40 });

                if (res) {
                    this.style.cursor = 'pointer';
                } else {
                    this.style.cursor = 'default';
                }
            } else {
                this.style.cursor = 'default';
            }
        })

        // 监听点击事件
        canvas.addEventListener('click', function(e) {
            // 获取点击的点是否是开始游戏的范围
            var res = Tool.isScope({ x: e.offsetX, y: e.offsetY }, { x: (canvas.width - 270) / 2, y: 350, width: 270, height: 40 });

            if (res) {
                // 开启游戏
                Game.init();
                isOver = false;
            }
        })
    },

    // 所有精灵图初始化
    init: function() {
        // canvas.width = document.documentElement.clientWidth;
        // canvas.height = document.documentElement.clientHeight;

        // 背景图
        this.background = new Background();

        // 我机
        this.plane = new Plane();

        // 子弹集合
        this.bulletSet = new BulletSet(this.plane);

        // 敌机集合
        this.enemySet = new EnemySet();

        // 爆炸图集合
        this.bombSet = new BombSet();

        // 分数集合
        this.text = new Text();

        // 监听事件
        this.on();

        // 分数
        this.score = 0;
        // 精灵数量
        this.total = 0;

        this.timer;

        // 执行动画
        this.animate();

        // 背景音乐
        this.bgAudio = new Audio();
        this.bgAudio.src = './audio/bgm_zhandou2.mp3';
        this.bgAudio.loop = true;
        this.bgAudio.play();

        // 子弹发射音量
        this.bulletAudio = new Audio();
        this.bulletAudio.src = './audio/arrow_shot.wav';

        // 爆炸声音
        this.bombAudio = new Audio();
        this.bombAudio.src = './audio/meteorit_explode.mp3';
    },

    // 开始执行动画
    animate: function() {
        this.timer = requestAnimationFrame(Game.animate);
        Game.draw();
    },

    // 绘制
    draw: function() {
        // 清空画布
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        // 背景图
        this.background.draw();

        if (this.plane.isShow) {
            // 我机
            this.plane.draw();
            // 子弹集合
            this.bulletSet.draw(this.bulletAudio);
            // 敌机集合
            this.enemySet.draw();

            // 是否有碰撞
            this.collide();
        } else {
            // 边框
            Tool.drawRoundedRect(ctx, (canvas.width - 200) / 2, 360, 200, 80, 4, 0, '#FCE99E', '#FCE99E');
            this.text.draw('Game Over', 256, 400);

            cancelAnimationFrame(this.timer);
        }

        // 爆炸图集合
        this.bombSet.draw();

        // 分数
        this.text.draw('当前分数：' + this.score, 80, 30);
        // 绘制精灵总个数
        // 精灵总数量
        this.count();
        this.text.draw('精灵个数：' + this.total, 420, 30);
    },

    // 事件监听
    on: function() {
        var that = this;
        window.addEventListener('keydown', function(e) {
            that.plane.keydown(e);
        }, false);

        window.addEventListener('keyup', function(e) {
            that.plane.keyup(e);
        }, false);
    },

    // 碰撞检测
    collide: function() {
        // 子弹数量
        var BulletLength = this.bulletSet.set.length;
        // 敌机数量
        var EnemySetLength = this.enemySet.set.length;

        // 敌机集合
        for (var j = 0; j < EnemySetLength; j++) {
            // 子弹集合
            for (var i = 0; i < BulletLength; i++) {
                var res = Tool.isOverlap(this.bulletSet.set[i], this.enemySet.set[j]);
                if (!res) {
                    this.score += this.enemySet.set[j].life;

                    // 敌机生命值先减1
                    this.enemySet.set[j].life--;

                    // 如果减到0，则删除敌机，创建爆炸图
                    if (this.enemySet.set[j].life == 0) {
                        // 碰撞了，生成爆炸图，并且将爆炸图推入到集合中
                        var bomb = new Bomb(this.enemySet.set[j]);
                        this.bombSet.set.push(bomb);
                        // 爆炸声音
                        // 先暂停，并且将时间设置为0
                        this.bombAudio.pause();
                        this.bombAudio.currentTime = 0;

                        this.bombAudio.play();

                        this.score += this.enemySet.set[j].life;

                        this.enemySet.set[j].isShow = false;
                    }

                    // 碰撞之后，子弹一定没啦
                    this.bulletSet.set[i].isShow = false;

                    break;
                }
            }

            // 敌机和我机碰撞
            var res = Tool.isOverlap(this.plane, this.enemySet.set[j]);
            if (!res) {
                // 碰撞了，生成爆炸图，并且将爆炸图推入到集合中
                var bomb = new Bomb(this.enemySet.set[j]);
                this.bombSet.set.push(bomb);

                this.enemySet.set[j].isShow = false;
                this.plane.isShow = false;
            }
        }
    },

    // 计算精灵总数量
    count: function() {
        // 每次初始化
        this.total = 0;

        // 背景图
        this.total += 1;

        // 我机
        this.total += 1;

        // 敌机
        this.total += this.enemySet.set.length;

        // 子弹
        this.total += this.bulletSet.set.length;

        // 爆炸图
        this.total += 1;

    }
}